package com.shujia.day07.ketang;

public class Code02AbstractDemo {
    public static void main(String[] args) {
        /*
            在之前的案例中，父类实际上是一个概念的集合，现实生活中父类也是抽象（abstract）的概念,对于这些类，我们可以用Java中
            的关键字（abstract）对其进行做修饰，其中的子类（猫、狗）可以对其进行做继承，分别去实现抽象父类中的一些功能或方法，比如eat()
            猫和狗应该都有自己独有的进食方式

            abstract 关键字 可以修饰类 也可以修饰方法
            修饰类 那么可以称为一个抽象类
            修饰方法  那么可以称为一个抽象方法

            案例：
                对于爷爷辈 是一个顶级父类，爷爷辈有一些资产可以被子类继承，而这些资产不是抽象的，但同时也有一些意愿，也会被继承，
                    这些意愿实际上是一个抽象的概念，而子类继承时，需要完成父类的意愿，那么就是需要给定具体的实现方法


           抽象类的注意事项：
                1、当一个类中存在有一个抽象方法时，其父类也必须是一个抽象类
                2、抽象类中也可以存在有具体的实现方法
                3、抽象类不能被实例化
                4、抽象类可以存在有构造方法,原因是什么？ 子类在构造对象时，需要获取父辈的构造方法
                5、当一个具体的类继承抽象类时，必须要实现其抽象方法
                6、抽象类 也可以被抽象类继承 ,被继承时，可以实现其抽象方法或不实现
                7、抽象类中的变量和常量都可以定义，并被继承



         */

        Son son = new Son();
        System.out.println("现在我有了父亲传下来的" + son.familyRevival() + "钱");

//        Father father = new Father();
//        father.familyRevival();
//        System.out.println(father.money);

        // 对象不能继承，类可以继承
        Son son1 = new Son();
        son1.familyRevival();
        System.out.println(son1.money);

//        father.familyLog();
        son1.familyLog();

        System.out.println(son1.AGE);
        System.out.println(son1.money);


//        new Granddad(); // 人死不能复生


    }
}


// 抽象类
abstract class Granddad {

    public Granddad(int money) {
        this.money = money;
    }

    public Granddad() {
    }

    int money = 0;
    final int AGE = 100;

    // 抽象方法 没有具体的实现逻辑
    // 对于抽象方法来说，可以给定方法的格式(框架：方法名 参数 返回值)
    public abstract int familyRevival();
//    {
//        System.out.println("可以。。。。。");
//    }


    public void familyLog() {
        System.out.println("凡是我族后辈，必须勤俭节约，不得造次..");
    }
}


abstract class Father extends Granddad {


//    int money;

    // 当父亲辈继承了爷爷辈，需要重写爷爷辈的意愿，同时这是被迫的
//    @Override
//    public int familyRevival() {
//
//        System.out.println("我完成了爷爷辈的意愿,赚了10000元");
//        money += 10000;
//        return 10000;
//    }

}


// alt+enter 按键 自动编写
class Son extends Father {
//    @Override
//    public int familyRevival() {
//        return 0;
//    }

    // 当儿子辈继承父亲辈 那么不需要强制继承上一辈的意愿，因为上一辈的意愿已经被完成.

    @Override
    public int familyRevival() {
        System.out.println("继承了父亲的意愿，继续赚钱...");
        money += 1;
        return 1;
    }

}


